#include<pthread.h>
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>

void clean_fun1(void *arg)
{
    printf("【1】清理结束\n");
}

void* pthread_fun(void *arg)
{
    //注册清理函数
    pthread_cleanup_push(clean_fun1,NULL);

    int i = 0;
    while(1)
    {
        sleep(1);
        printf("子线程执行%ds\n",++i);
        if(i == 3)
            break;
    }
    sleep(1);
    //调用pthread_exit,会弹出和执行清理函数
    pthread_exit(NULL);

    //此处执行不到pthread_cleanup_pop，但一般也要有
    printf("弹出清理函数\n");
    pthread_cleanup_pop(1);
}
int main()
{
    printf("进程执行中...\n");
    pthread_t id;
    if(pthread_create(&id,NULL,pthread_fun,NULL) == -1)
    {
        perror("fail to pthread");
        exit(-1);
    }

    #if 0
    //运行3s后取消线程，发送终止信号,会调用清理函数
    sleep(3);
    if(pthread_cancel(id) != 0)
    {   
        perror("fail to cancel");
        exit(-1);
    }
    #endif

    pthread_join(id,NULL);
    printf("进程退出\n");
    return 0;
}